//package download;
//
//import util.ProgressUtil;
//
//import java.io.IOException;
//import java.io.InputStream;
//import java.io.RandomAccessFile;
//import java.net.HttpURLConnection;
//import java.net.URL;
//import java.util.concurrent.atomic.AtomicLong;
//
///**
// * @Description 下载任务
// * @Author 冷彭磊
// * @Data 2025/2/26 9:00
// */
//public class DownloadTask implements Runnable{
//
//    private final long start;
//    private final long end;
//    private final String fileurl;
//    private final String filePath;
//    private final AtomicLong downloadByteCount;
//    private DownloadListener listener;
//    private long fileSize;
//    //start：起始位置   end:结束位置    url：任务下载的url   filePath:保存的路径   downloadByteCount:计数器
//    public DownloadTask(long start, long end, String url, String filePath, AtomicLong downloadByteCount,DownloadListener listener,long fileSize) {
//        this.start = start;
//        this.end = end;
//        this.fileurl = url;
//        this.filePath = filePath;
//        this.downloadByteCount = downloadByteCount;
//        this.listener = listener;
//        this.fileSize = fileSize;
//    }
//
//
//    @Override
//    public void run() {
//        long currentStart = start; // 调整起始位置
//
//        HttpURLConnection con = null;
//        InputStream inputStream = null;
//        RandomAccessFile randomAccessFile = null;
//
//        int maxRetries = 3;
//        int retryCount = 0;
//        boolean success = false;
//        long retryTime = 1000;
//        while (retryCount < maxRetries && !success){
//            try {
//                URL url = new URL(fileurl);
//                con = (HttpURLConnection) url.openConnection();
//                con.setConnectTimeout(10000);
//                con.setRequestMethod("GET");
//                con.setRequestProperty("Range","bytes=" + currentStart + "-" + end);
//
//                int code = 0;
//                try {
//                    code = con.getResponseCode();
//                } catch (IOException e){
//                    success = false;
//                    listener.onError(fileurl,"网络请求出错,即将重新请求" + e);
//                }
//                if (code == HttpURLConnection.HTTP_PARTIAL){
//                    inputStream = con.getInputStream();
//                    randomAccessFile = new RandomAccessFile(filePath, "rwd");
//                    randomAccessFile.seek(currentStart); // 将文件记录指针定位到start位置
//                    byte[] bytes = new byte[1024];
//                    int len;//临时存储
//                    while ((len = inputStream.read(bytes) )!= -1){
//                        randomAccessFile.write(bytes,0,len);
//                        long downloaded = downloadByteCount.addAndGet(len);
////                        listener.onProgress(fileurl,Thread.currentThread().getName(),downloaded,fileSize);
//                        ProgressUtil.saveProgress(fileurl,downloadByteCount.get(),listener);
//
//                         //模拟下载中断
////                        if (downloaded >= fileSize / 2) {
////                            retryCount  = 3;
////                            throw new IOException("模拟下载中断");
////                        }
//
//                    }
//                    success = true;
//                }
//            } catch (IOException e) {
//                listener.onError(fileurl, "下载失败: " + e.getMessage());
//            } finally {
//                retryCount++;
//                if (retryCount < maxRetries && !success){
//                    try {
//                        Thread.sleep(retryTime);
//                    } catch (InterruptedException e) {
//                        listener.onError(fileurl,"重试时线程中断"  + e.getMessage());                    }
//                }
//
//                try {
//                    if (randomAccessFile != null) randomAccessFile.close();
//                    if (inputStream != null) inputStream.close();
//                    if (con != null) con.disconnect();
//                } catch (IOException e) {
//                    listener.onError(fileurl,"资源关闭失败"  + e.getMessage());
//                }
//            }
//        }
//        if (!success){
//            listener.onError(fileurl,"重试三次后网络请求仍然出错");
//        }
//    }
//
//
//
//
//
//
//
//
//
//}
//
//
//
//
